1 REM "THREE VOICE PLAYER" 2 REM PLAY 1, 2, OR 3 VOICES WITH THIS ROUTINE 3 REM ADD IT TO YOUR PROGRAMS: ADJUST THE DURATIONS AT 9200-9210 AS NEEDED 4 REM 5 REM PLAYS "GOD SAVE THE KING" ("MY COUNTRY, 'TIS OF THEE") 6 REM 7 PRINT"[147]":POKE53280,0:POKE53281,6 8 PRINT:PRINTTAB(10)"THREE VOICE PLAYER" 9 PRINT:PRINTTAB(10)"GOD SAVE THE KING" 10 GOSUB 9000:GOTO 120 60 FOR N=1 TO LEN(MD$(PH)) 61 FOR VC=0 TO EV% 62 POKE GR(VC),UG%(VC):REM NORMAL NOTES; DON'T POKE UG% FOR LEGATO 63 FOR I=0 TO 1 64 POKE FR(VC,I),PI%(ASC(MID$(ME$(PH,VC),N,1)),I) 65 NEXT:NEXT 66 FOR VC=EV% TO 0 STEP -1:POKE GR(VC),G%(VC):NEXT 67 FOR I=0 TO DU%(VAL(MID$(MD$(PH),N,1))):NEXT 68 REM FOR VC=0 TO EV%:POKE GR(VC),UG%(VC):NEXT:REM STACCATO NOTES 69 NEXT:PH=PH+1:IF PH>ES% THEN PH=0 70 FOR VC=0 TO EV%:POKE GR(VC),UG%(VC):NEXT:RETURN 100 GOSUB 60 110 IF PEEK(653)>0 THEN END 120 PRINT "PHRASE "PH 190 GOTO 100 8997 REM 8998 REM SET UP SOUND SHAPE 8999 REM 9000 DIM MD$(23),ME$(23,2),MV$(23,2),G%(2),GR(2),FR(2,1),AD(2) 9001 DIM DU%(9),PI%(168,1),AK%(2),DY%(2),SN%(2),RE%(2),WF%(2) 9007 REM 9008 REM ATTACK--VOICES 0,1,2 9009 REM NUMBER FROM 0 TO 15; LOWER NUMBER=SHARPER ATTACK 9010 AK%(0)=2:AK%(1)=2:AK%(2)=2 9015 FOR I=0 TO 2:AK%(I)=AK%(I)*16:NEXT 9017 REM 9018 REM DECAY--VOICES 0,1,2 9019 REM NUMBER FROM 0 TO 15; LOWER NUMBER=FASTER DECLINE 9020 DY%(0)=4:DY%(1)=6:DY%(2)=6 9027 REM 9028 REM SUSTAIN--VOICES 0,1,2 9029 REM NUMBER FROM 0 TO 15; LOWER NUMBER=SOFTER VOLUME DURING SUSTAIN 9030 SN%(0)=12:SN%(1)=8:SN%(2)=9 9035 FOR I=0 TO 2:SN%(I)=SN%(I)*16:NEXT 9037 REM 9038 REM RELEASE--VOICES 0,1,2 9039 REM NUMBER FROM 0 TO 15; LOWER NUMBER=FASTER DROP TO SILENCE AT END 9040 RE%(0)=0:RE%(1)=3:RE%(2)=5 9047 REM 9048 REM SET SOUND ADDRESSES 9049 REM 9050 FR(0,0)=54272:FR(1,0)=54279:FR(2,0)=54286 9055 FOR I=0 TO 2:FR(I,1)=1+FR(I,0):GR(I)=FR(I,0)+4:AD(I)=GR(I)+1:NEXT 9057 REM 9058 REM POKE ADSR ENVELOPES 9059 REM 9060 FOR I=0 TO 2:POKE AD(I),AT%(I) OR DY%(I) 9065 POKE AD(I)+1,SN%(I) OR RE%(I):NEXT 9066 REM 9067 REM SET UP GATES 9068 REM WAVEFORMS, VOICES 0,1,2 (ADD VALUES): 9069 REM TRIANGLE ON=16; SAWTOOTH ON=32; PULSE ON=64 (SET WIDTH!); NOISE ON=128 9070 WF%(0)=64:WF%(1)=64:WF%(2)=32 9075 FOR I=0 TO 2:G%(I)=1 OR WF%(I):UG%(I)=G%(I)AND 254:NEXT 9077 REM 9078 REM SET PULSE WIDTHS 9079 REM VOICES 0,1,2; LOW BYTE, HIGH BYTE 9080 POKE GR(0)-2,200:POKE GR(0)-1,3 9081 POKE GR(1)-2,200:POKE GR(1)-1,3 9082 POKE GR(2)-2,200:POKE GR(2)-1,3 9096 REM 9097 REM SET UP PITCH ARRAY 9098 REM EACH NOTE, IN ALL ITS OCTAVES 9099 REM C 9100 X%=3:GOSUB 9190 9101 DATA 12,1,24,2,48,4,97,8,195,16,135,33,15,67,30,134 9102 REM D 9103 X%=4:GOSUB 9190 9104 DATA 45,1,90,2,180,4,104,9,209,18,162,37,69,75,139,150 9105 REM E (F-FLAT) 9106 X%=5:GOSUB 9190:Y%=13:GOSUB 9195 9107 DATA 81,1,163,2,71,5,143,10,31,21,62,42,125,84,250,168 9108 REM F (E-SHARP) 9109 X%=6:GOSUB 9190:Y%=19:GOSUB 9195 9110 DATA 102,1,204,2,152,5,48,11,96,22,193,44,131,89,6,179 9111 REM G 9112 X%=7:GOSUB 9190 9113 DATA 145,1,35,3,71,6,143,12,30,25,60,50,121,100,243,200 9114 REM A 9115 X%=1:GOSUB 9190 9116 DATA 195,1,134,3,12,7,24,14,49,28,99,56,199,112,143,225 9117 REM B 9118 X%=2:GOSUB 9190 9119 DATA 250,1,244,3,233,7,210,15,165,31,75,63,151,126,46,253 9120 REM D-FLAT (C-SHARP) 9121 X%=11:GOSUB 9190:Y%=17:GOSUB 9195 9122 DATA 28,1,56,2,112,4,225,8,195,17,134,35,12,71,24,142 9123 REM E-FLAT (D-SHARP) 9124 X%=12:GOSUB 9190:Y%=18:GOSUB 9195 9125 DATA 62,1,125,2,251,4,247,9,239,19,223,39,191,79,126,159 9126 REM G-FLAT (F-SHARP) 9127 X%=14:GOSUB 9190:Y%=20:GOSUB 9195 9128 DATA 123,1,246,2,237,5,218,11,181,23,107,47,214,94,172,189 9129 REM A-FLAT (G-SHARP) 9130 X%=8:GOSUB 9190:Y%=21:GOSUB 9195 9131 DATA 169,1,83,3,167,6,78,13,156,26,57,53,115,106,230,212 9132 REM B-FLAT (A-SHARP) 9133 X%=9:GOSUB 9190:Y%=15:GOSUB 9195 9134 DATA 221,1,187,3,119,7,239,14,223,29,190,59,124,119,248,238 9135 REM C-FLAT 9136 X%=10:GOSUB 9190 9137 DATA 4,1,250,1,244,3,233,7,210,15,165,31,75,63,151,126 9138 REM B-SHARP 9139 X%=16:GOSUB 9190 9140 DATA 24,2,48,4,97,8,195,16,135,33,15,67,30,134,255,255 9185 GOTO 9200 9189 REM READ PITCHES 9190 FOR I=0 TO 147 STEP 21:READ PI%(I+X%,0),PI%(I+X%,1):NEXT:RETURN 9194 REM IDENTICAL PITCHES 9195 FOR I=0 TO 147 STEP 21:PI%(I+Y%,0)=PI%(I+X%,0):PI%(I+Y%,1)=PI%(I+X%,1) 9196 NEXT:RETURN 9197 REM 9198 REM SET UP DURATIONS 9199 REM 9200 FOR I=0 TO 9:READ DU%(I):NEXT 9205 DATA 0,128,256,384,512,640,768,1024,1152,1280 9296 REM 9297 REM SET FILTER AND VOLUME 9298 REM FILTER FREQUENCY 9299 REM LOW BYTE (0-7) X%; HIGH BYTE (0-255) Y% 9300 X%=0:Y%=100 9305 POKE 54293,X%:POKE 54294,Y% 9308 REM FILTER ON? 9309 REM VOICE 1 ON=1; 2 ON=2; 3 ON=4; 1&2 ON=3; 2&3 ON=6; ALL ON=7 9310 X%=0 9318 REM FILTER RESONANCE 9319 REM PEAK VOLUME (0=LOW, 15=HIGH) 9320 Y%=14 9325 Y%=Y%*16:POKE 54295,X% OR Y% 9328 REM SELECT FILTER TYPE 9329 REM LOW-PASS=1;BAND-PASS=2;HIGH-PASS=4;LO-BAND=3;HI-BAND=6;ALL=7 9330 X%=1 9335 X%=X%*16 9337 REM 9338 REM SELECT OVERALL VOLUME 9339 REM 15=HIGH, 0=LOW 9340 Y%=15 9345 POKE 54296,X% OR Y% 9496 REM 9497 REM SET MELODIES HERE 9498 REM 9499 REM HOW MANY VOICES? (MINUS ONE) 9500 EV%=2 9508 REM 9509 REM HOW MANY PHRASES? (MINUS ONE) 9510 ES%=1 9514 REM 9515 REM MELODY STRINGS 9516 REM 9517 REM EACH PHRASE HAS ONLY ONE DU%(PH) STRING, NO MATTER HOW MANY VOICES 9518 REM EACH PHRASE HAS ONE ME$(PH,VC) & ONE MV$(PH,VC) STRING PER VOICE 9519 REM PHRASE 0 9520 MD$(0)="2224022224022228" 9521 ME$(0,0)="FFGEFGAA[191]AGFGFEF" 9522 MV$(0,0)="5 " 9523 ME$(0,1)="CCDCDECFGFEADAGC" 9524 MV$(0,1)="5 4 5" 9525 ME$(0,2)="FA[191]CCCFD[191]CCD[191]CCA" 9526 MV$(0,2)="3 234 34 343 " 9529 REM PHRASE 1 9530 MD$(1)="2224022224022000040200228" 9531 ME$(1,0)="CCCC[191]A[191][191][191][191]AGA[191]AGFA[191]CD[191]AGF" 9532 MV$(1,0)="6 5 6 5 " 9533 ME$(1,1)="AAAAGFGGGGFEFF@F@FEFFGFEA" 9534 MV$(1,1)="43 4 3 4 3 4 3" 9535 ME$(1,2)="FACFFFCEGCBCFDC[191]ACGA[191]DCCF" 9536 MV$(1,2)="2 32 1234 3 2 3 21" 9897 REM 9898 REM CONVERT STRINGS TO USABLE FORM 9899 REM 9900 FOR PH=0 TO ES%:FOR VC=0 TO EV% 9905 A$=ME$(PH,VC):ME$(PH,VC)="" 9910 FOR I=1 TO LEN(A$) 9920 X%=ASC(MID$(A$,I,1)) 9930 IF X%<72 THEN X%=X%-64:IF X%<0 THEN X%=0 9931 IF X%>192AND X%<200 THEN X%=X%-178 9932 IF X%=176 THEN X%=8 9933 IF X%=191 THEN X%=9 9934 IF X%=188 THEN X%=10 9935 IF X%=172 THEN X%=11 9936 IF X%=177 THEN X%=12 9937 IF X%=187 THEN X%=13 9938 IF X%=165 THEN X%=14 9939 IF X%>21 THEN X%=0 9950 V$=MID$(MV$(PH,VC),I,1):IF V$<>" " THEN Y%=21*VAL(V$) 9960 X%=X%+Y% 9970 ME$(PH,VC)=ME$(PH,VC)+CHR$(X%) 9975 NEXT:NEXT:NEXT 9980 PH=0 9990 RETURN